home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 46
/
Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso
/
-serious-
/
programming
/
other
/
hexy
/
src
/
hexy_fileio.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-09-06
|
10KB
|
377 lines
/*
* [!BGN - MACHINE GENERATED - DO NOT EDIT THIS HEADER]
*
* Program : Hexy (Binary file viewer/editor for the Amiga.)
* Version : 1.6
* File : Work:Source/!WIP/HisoftProjects/Hexy/Hexy_fileio.c
* Author : Andrew Bell
* Copyright : Copyright © 1998-1999 Andrew Bell (See GNU GPL)
* Created : Saturday 28-Feb-98 16:00:00
* Modified : Sunday 22-Aug-99 23:31:45
* Comment :
*
* (Generated with StampSource 1.2 by Andrew Bell)
*
* [!END - MACHINE GENERATED - DO NOT EDIT THIS HEADER]
*
*/
/* Created: Sun/09/Aug/1998 */
/*
* Hexy, binary file viewer and editor for the Amiga.
* Copyright (C) 1999 Andrew Bell
*
* Author's email address: andrew.ab2000@bigfoot.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <Hexy.h>
/* Prototypes */
Prototype BOOL ReadFile(UBYTE *FileName, struct VCtrl *VC);
Prototype UBYTE *ObtainInFile( void );
Prototype UBYTE *ObtainOutFile( void );
Prototype void SaveSplit(struct VCtrl *TmpVC);
Prototype void SaveToNewLocation(struct VCtrl *TmpVC);
BOOL ReadFile(UBYTE *FileName, struct VCtrl *TmpVC)
{
/*************************************************
*
* Load a file into a VC structure
*
*/
BPTR InLock = NULL, InFile = NULL;
BOOL lresult = TRUE;
Edit_End();
FreeVC(TmpVC); /* Deallocate any previously loaded file */
if (InLock = Lock(FileName, SHARED_LOCK))
{
if (TmpVC->VC_FIB = (struct FileInfoBlock *) AllocDosObject(DOS_FIB, NULL))
{
if (Examine(InLock, TmpVC->VC_FIB))
{
strcpy( (UBYTE *) &CurFileLoaded, TmpVC->VC_FIB->fib_FileName);
TmpVC->VC_FileLength = TmpVC->VC_FIB->fib_Size;
TmpVC->VC_CurrentPoint = NULL; /* Start of file */
TmpVC->VC_InitialYPos = 24-10;
TmpVC->VC_YAmount = YLINES;
TmpVC->VC_XPos = 14-4;
if (TmpVC->VC_FIB->fib_DirEntryType < 0)
{
if (TmpVC->VC_FileLength)
{
if (TmpVC->VC_FileAddress = (APTR) AllocVec(TmpVC->VC_FileLength, MEMF_ANY))
{
if (InFile = Open(FileName, MODE_OLDFILE))
{
stream[0] = (ULONG) &(TmpVC->VC_FIB->fib_FileName);
stream[1] = (ULONG) TmpVC->VC_FIB->fib_Size;
PrintStatus("Loading file: %.35s (%lu bytes)", &stream);
if (Read(InFile, TmpVC->VC_FileAddress, TmpVC->VC_FileLength) == TmpVC->VC_FileLength)
{
UnpackFile(TmpVC);
CheckForViruses(TmpVC);
SetVDragBar(TmpVC);
UpdateView(TmpVC, NULL);
DisplayFileInfos(&VC);
}
else
{
DoError(FALSE); lresult = FALSE;
}
Close(InFile);
}
else
{
DoError(FALSE); lresult = FALSE;
}
}
else
{
DoError(FALSE); lresult = FALSE;
}
}
else
{
/* Empty file */
}
}
else
{
DoError(FALSE); lresult = FALSE;
}
}
else
{
DoError(FALSE); lresult = FALSE;
}
/* FreeDosObject(DOS_FIB, VC_FIB); */
}
else
{
DoError(FALSE); lresult = FALSE;
}
UnLock(InLock);
}
else
{
DoError(FALSE); lresult = FALSE;
}
if (!lresult) FreeVC(TmpVC);
return lresult;
}
UBYTE FullInPath[1024+4];
UBYTE *ObtainInFile( void )
{
/*************************************************
*
* Open requester and load a file
*
*/
BOOL res = AslRequestTags(FR, ASLFR_Window, MAINWnd,
ASLFR_TitleText, "Select input file...",
ASLFR_PositiveText, "Load",
TAG_DONE);
if (res)
{
if (FR->fr_File[0] == 0)
{
PrintStatus("No filename was given!", &stream);
return NULL;
}
strcpy(FullInPath, FR->fr_Drawer);
if (AddPart( (UBYTE *) &FullInPath, FR->fr_File, 1024))
{
return FullInPath;
}
else
{
PrintStatus("Unable to load selected file: Path is too long!", NULL);
}
}
else
{
PrintStatus("Requester aborted!", NULL);
}
return NULL;
}
UBYTE FullOutPath[1024+4];
UBYTE *ObtainOutFile( void ) /* Add FR param */
{
/*************************************************
*
* Open a file requeter that request an output file
*
*/
UBYTE *Result = (UBYTE *) &FullOutPath;
BOOL res = AslRequestTags(FR, ASLFR_Window, MAINWnd,
ASLFR_Flags1, FRF_DOSAVEMODE,
ASLFR_TitleText, "Select output file...",
ASLFR_PositiveText, "Save",
TAG_DONE);
if (res)
{
if (FR->fr_File[0] == 0)
{
PrintStatus("No filename was given!", &stream);
return NULL;
}
strcpy(FullOutPath, FR->fr_Drawer);
if (AddPart( (UBYTE *) &FullOutPath, FR->fr_File, 1024))
{
BPTR InLock;
if (InLock = Lock(FullOutPath, SHARED_LOCK))
{
struct FileInfoBlock *FIB;
if (FIB = (struct FileInfoBlock *) AllocDosObject(DOS_FIB, NULL))
{
if (Examine(InLock, FIB))
{
if (FIB->fib_Protection & FIBF_DELETE)
{
struct EasyStruct ProtectedES =
{
sizeof(struct EasyStruct),
NULL,
"Hexy info...",
"File already exists and is protected from deletetion\nOverwrite it anyway?",
"Yes|No"
};
if (EasyRequestArgs(MAINWnd, &ProtectedES, NULL, &stream))
{
ULONG PFlags = FIB->fib_Protection & ~FIBF_DELETE;
SetProtection(FullOutPath, PFlags);
PrintStatus("File overwritten.", NULL);
}
else
{
Result = (UBYTE *) NULL;
PrintStatus("File was not overwritten.", NULL);
}
}
}
else DoError(FALSE);
FreeDosObject(DOS_FIB, FIB);
}
else DoError(FALSE);
UnLock(InLock);
}
else DoError(FALSE);
return Result;
}
else PrintStatus("Unable to save file: Path is too long!", NULL);
}
else PrintStatus("Requester aborted!", NULL);
return NULL;
}
ULONG OutLen = NULL;
UWORD putchproc[] = { 0x16c0, 0x4e75 };
void SaveSplit(struct VCtrl *TmpVC)
{
/*************************************************
*
* Perform a split save
*
*/
UBYTE *OutFileName;
if (!ValidFile(TmpVC)) return;
stream[0] = (ULONG) RT_Window;
stream[1] = (ULONG) MAINWnd;
stream[2] = (ULONG) RTGL_Min;
stream[3] = (ULONG) 1;
stream[4] = (ULONG) RTGL_Max;
stream[5] = (ULONG) TmpVC->VC_FileLength;
stream[6] = (ULONG) RTGL_TextFmt;
stream[7] = (ULONG) "Enter save chunk length...";
stream[8] = (ULONG) RTGL_Flags;
stream[9] = (ULONG) GLREQF_CENTERTEXT;
stream[10] = (ULONG) RT_LockWindow;
stream[11] = (ULONG) TRUE;
stream[12] = (ULONG) TAG_DONE;
OutLen = 0; /* 1024*10; */ /* This is temp */
if ( rtGetLongA( (ULONG *) &OutLen, "Split save...", RTFR, (struct TagItem *) &stream) )
{
if (OutFileName = ObtainOutFile())
{
UBYTE TempPathBuf[1024+4];
ULONG LoopCnt = NULL, BytesLeft = TmpVC->VC_FileLength;
UBYTE *SaveAddress = TmpVC->VC_FileAddress;
BPTR OutFile;
if (TmpVC->VC_FileLength < OutLen) OutLen = TmpVC->VC_FileLength;
do
{
stream[0] = (ULONG) OutFileName;
stream[1] = (ULONG) LoopCnt++;
RawDoFmt("%.1000s.%04lu", &stream, (void *) &putchproc, &TempPathBuf);
stream[0] = (ULONG) FilePart(TempPathBuf);
PrintStatus("Saving '%s'... (LMB = Abort)", &stream);
if (OutFile = Open(TempPathBuf, MODE_NEWFILE))
{
if (Write(OutFile, SaveAddress, OutLen) == OutLen)
{
SaveAddress += OutLen; Close(OutFile);
} else DoError(FALSE);
}
BytesLeft -= OutLen;
if (BytesLeft < OutLen) OutLen = BytesLeft;
if (LMBActive()) break;
}
while(BytesLeft > 0);
stream[0] = (ULONG) LoopCnt;
PrintStatus("Saved %lu chunks.", &stream);
}
}
}
void SaveToNewLocation(struct VCtrl *TmpVC)
{
/*************************************************
*
* Save file to another location
*
*/
UBYTE *OutFileName;
if (!ValidFile(TmpVC)) return;
if (OutFileName = ObtainOutFile())
{
BPTR OutFile;
if (OutFile = Open(OutFileName, MODE_NEWFILE))
{
if (Write(OutFile, TmpVC->VC_FileAddress, TmpVC->VC_FileLength) != TmpVC->VC_FileLength)
{
DoError(FALSE);
}
else
{
PrintStatus("File was saved OK.", &stream);
}
Close(OutFile);
SetProtection(OutFileName, TmpVC->VC_FIB->fib_Protection);
SetComment(OutFileName, (UBYTE *) &TmpVC->VC_FIB->fib_Comment);
}
else DoError(FALSE);
}
}
/*************************************************
*
*
*
*/